package JVM.第08篇_JVM性能调优案例篇;

/**
 * 1.推荐配置
 *     Java heap: -Xms  -Xmx
 *          Full GC 后所占空间的  3-4倍
 *     元空间  -XX: PermSize     -XX:MaxPermSize
 *          Full GC 后所占空间的  1.2-1.5 倍
 *      新生代   -Xmn
 *          Full GC 后所占空间的   1-1.5  倍
 *      老年代
 *          Full GC 后所占空间的   2-3   倍
 *
 * 如何计算老年代存活对象
 *      1.JVM参数中添加GC日志，GC日志中会记录每次Full GC之后各代的内存大小，
 *      观察老年代GC之后的空间大小。
 *      可观察一段时间内(比如2天)的FullGC 后的内存情况，根据多次的FullGC之后的老年代的空
 *      间大小数据来预估FullGC之后老年代的存活对象大小
 *      (可根据多次FullIGC之后的内存大小取平均值)。
 *      2.强制触发 FullGC
 *      ● 会影响线上服务，慎用!
 *      ● 方式1的方式比较可行，但需要更改JVM参数，并分析日志。
 *      同时，在使用CMS回收器的时候，有可能不能触发FullGC,
 *      所以日志中并没有记录FullGC的日志。在分析的时候就比较难处理。
 *      所以，有时候需要强制触发一次FullGC,来观察FullGC之后的老年代存活对象大小。
 *      ● 注:强制触发FullIGC,会造成线上服务停顿(STW)，要谨慎!
 *      建议的操作方式为，在强制FullGC前先把服务节点摘除，
 *      FullGC之后再将服务挂回可用节点，对外提供服务，
 *      在不同时间段触发FullGC，
 *      根据多次FullGC之后的老年代内存情况来预估FullGC之后的老年代存活对象大小
 *      ● 如何强制触发Full GC?
 *       1、jmap -dump:live,format=b,file=heap.bin <pid>
 *           将当前的存活对象dump到文件，此时会触发FullGC
 *       2、jmap -histo:live <pid>打印每个class的实例数目,内存占用,
 *       类全名信息live子参数加上后,只统计活的对象数量.此时会触发FullGC
 *       3、在性能测试环境，可以通过Java监控工具来触发FullGC,
 *       比如使用VisualVM和JConsole,
 *       VisualVM集成了JConsole, VisualVM或 者]Console上面有一个触发GC的按钮。
 *
 * jps  查看java的所有线程
 * jmap -heap 线程数   //查看此线程的堆使用情况
 *
 * 你会估算GC频率吗?
 * 正常情况我们应该根据我们的系统来进行一个内存的估算，这个我们可以在测试环境进行测试，
 * 最开始可以将内存设置的大一些，比如4G这样，当然这也可以根据业务系统估算来的。
 * 比如从数据库获取一条数据占用128个字节，需要获取1000条数据，
 * 那么一次读取到内存的大小就是(128 B/1024 Kb/1024M) * 1000 = 0.122M，
 * 那么我们程序可能需要并发读取，比如每秒读取100次，
 * 那么内存占用就是0.122*100 = 12.2M，如果堆内存设置1个G，
 * 那么年轻代大小大约就是333M，那么333M*80%/ 12.2M =21.84s ，
 * 也就是说我们的程序几乎每分钟进行两到三次 youngGC。
 * 这样可以让我们对系统有一个大致的估算。
 */
public class C3_合理配置堆内存 {

}
